﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades;

namespace AccesoBD
{
    public class Usuarios
    {

        public static bool validarDuplicadoNombreUsr(string nombre)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "SELECT     codUsuario, nombre FROM Usuario "
                                + "WHERE     (nombre like @nombre) ";
                List<SqlParameter> lstp = new List<SqlParameter>();
                lstp.Add(new SqlParameter("@nombre", nombre));
                SqlDataReader r = DB.GenerarReader(comando, lstp, con, tran);
                if (r.Read())
                {
                    resultado = true;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }

        public static bool validarExistenciaDeUsuarioMEdico(long legajo)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "SELECT     codUsuario, nombre FROM Usuario "
                                + "WHERE     (legajoMedico = @legajo ) ";
                List<SqlParameter> lstp = new List<SqlParameter>();
                lstp.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader r = DB.GenerarReader(comando, lstp, con, tran);
                if (r.Read())
                {
                    resultado = true;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return resultado;

        }
        public static bool validarExistenciaDeUsuarioEmpleado(long legajo)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "SELECT     codUsuario, nombre FROM Usuario "
                                + "WHERE     (legajoEmpleado=@legajo) ";
                List<SqlParameter> lstp = new List<SqlParameter>();
                lstp.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader r = DB.GenerarReader(comando, lstp, con, tran);
                if (r.Read())
                {
                    resultado = true;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return resultado;

        }
        public static bool registrarAltaUsuario(Usuario u)
        {
            bool resultado = false;
            int res = 0;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "INSERT INTO Usuario "
                      + "(nombre, contraseña, idRol, fechaAltaUsuario, estaLogueado, activo, legajoMedico, legajoEmpleado, Descripcion,quiereMensajeBienvenida) "
                      + "VALUES     (@nombre,@contraseña,@idRol,@fechaAlta,@estaLogueado,@activo,@legajoMedico,@legajoEmpleado,@Descripcion,@quiereMensajeBienvenida)";
                List<SqlParameter> lsp = new List<SqlParameter>();
                lsp.Add(new SqlParameter("@nombre", u.Nombre));
                lsp.Add(new SqlParameter("@contraseña", u.Contraseña));
                lsp.Add(new SqlParameter("@idRol", u.IdRol));
                lsp.Add(new SqlParameter("@estaLogueado", false));
                lsp.Add(new SqlParameter("@fechaAlta", u.FechaAlta));
                lsp.Add(new SqlParameter("@activo", true));
                lsp.Add(new SqlParameter("@quiereMensajeBienvenida", true));
                if (u.descripcion != null)
                {
                    lsp.Add(new SqlParameter("@Descripcion", u.descripcion));
                }
                else
                {
                    lsp.Add(new SqlParameter("@Descripcion", DBNull.Value));
                }
                if (u.legajoEmpleado != 0)
                {
                    lsp.Add(new SqlParameter("@legajoEmpleado", u.legajoEmpleado));
                    lsp.Add(new SqlParameter("@legajoMedico", DBNull.Value));


                }
                if (u.legajoMedico != 0)
                {
                    lsp.Add(new SqlParameter("@legajoMedico", u.legajoMedico));
                    lsp.Add(new SqlParameter("@legajoEmpleado", DBNull.Value));
                }
                res = DB.EjecutarCommand(comando, lsp, con, tran);
                if (res > 0)
                {
                    long codUs = obtenerUltimoIdUsr(con, tran);
                    if (u.legajoMedico != 0)
                    {

                        comando = "UPDATE Medico SET idUsuario = @idUsuario WHERE (legajo = @legajo)";
                        lsp = new List<SqlParameter>();
                        lsp.Add(new SqlParameter("@idUsuario", codUs));
                        lsp.Add(new SqlParameter("@legajo", u.legajoMedico));
                    }
                    if (u.legajoEmpleado != 0)
                    {
                        comando = "UPDATE    Empleado SET (idUsuario = @idUsuario) WHERE (legajoEmpleado = @legajo)";
                        lsp = new List<SqlParameter>();
                        lsp.Add(new SqlParameter("@idUsuario", codUs));
                        lsp.Add(new SqlParameter("@legajo", u.legajoMedico));
                    }
                    res = DB.EjecutarCommand(comando, lsp, con, tran);
                    if (res > 0)
                    {
                        tran.Commit();
                        resultado = true;
                    }

                }
            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {

                con.Close();
            }

            return resultado;


        }
        public static long obtenerUltimoIdUsr(SqlConnection con, SqlTransaction tran)
        {
            long idUs = 0;

            try
            {
                string comando = "select Max(codUsuario) from Usuario";
                List<SqlParameter> listp = new List<SqlParameter>();
                string cod = DB.EjecutarScalar(comando, listp, con, tran);
                if (!string.IsNullOrEmpty(cod))
                {
                    idUs = long.Parse(cod.ToString());
                }
            }
            catch (Exception Ex)
            {
                throw new Exception("Error al obtener ultimo id Usuario: " + Ex.Message);
            }
            finally
            {

            }
            return idUs;

        }
        public static Usuario obtenerUsurio(string nombre)
        {
            Usuario userLogin = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Usuario.codUsuario,Usuario.contraseña, Usuario.nombre, Usuario.contraseña, Usuario.activo, Usuario.idRol, Usuario.estaLogueado, Rol.nombre AS nombreRol, Usuario.quiereMensajeBienvenida,Usuario.inicioPrimeraVez,Usuario.legajoMedico, Usuario.legajoEmpleado "
                                + "FROM Usuario INNER JOIN Rol ON Usuario.idRol = Rol.idRol "
                                + "WHERE (Usuario.nombre = @nombreUser) AND (Usuario.activo = 1)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nombreUser", nombre));
                
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        userLogin = new Usuario();
                        userLogin.Contraseña = dr["contraseña"].ToString();
                        userLogin.Nombre = dr["nombre"].ToString();
                        userLogin.CodUsuario = int.Parse(dr["codUsuario"].ToString());
                        userLogin.IsActivo = bool.Parse(dr["activo"].ToString());
                        userLogin.IdRol = int.Parse(dr["idRol"].ToString());
                        userLogin.NombreRol = dr["nombreRol"].ToString();
                        if (dr["inicioPrimeraVez"] == DBNull.Value)
                        {
                            userLogin.inicioPrimeraVez = false;
                        }
                        else
                        {
                            userLogin.inicioPrimeraVez = (bool)dr["inicioPrimeraVez"];
                        }
                        if (dr["estaLogueado"] == DBNull.Value)
                            userLogin.IsLogueado = false;
                        else
                            userLogin.IsLogueado = bool.Parse(dr["estaLogueado"].ToString());
                        if (dr["quiereMensajeBienvenida"] == DBNull.Value)
                            userLogin.QuiereMsjBienvenida = false;
                        else
                            userLogin.QuiereMsjBienvenida = bool.Parse(dr["quiereMensajeBienvenida"].ToString());
                        if (dr["legajoMedico"] != DBNull.Value)
                        {
                            userLogin.legajoMedico = (long)dr["legajoMedico"];
                        }
                        if (dr["legajoEmpleado"] != DBNull.Value)
                        {
                            userLogin.legajoEmpleado = (long)dr["legajoEmpleado"];
                        }
                    }
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return userLogin;


        }
        public static Usuario validarUsuario(string nombre, string pw)
        {
            Usuario userLogin = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Usuario.codUsuario,Usuario.contraseña, Usuario.nombre, Usuario.contraseña, Usuario.activo, Usuario.idRol, Usuario.estaLogueado, Rol.nombre AS nombreRol, Usuario.quiereMensajeBienvenida,Usuario.inicioPrimeraVez,Usuario.legajoMedico, Usuario.legajoEmpleado "
                                + "FROM Usuario INNER JOIN Rol ON Usuario.idRol = Rol.idRol "
                                + "WHERE (Usuario.nombre = @nombreUser) AND (Usuario.contraseña = @pwUser) AND (Usuario.activo = 1)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nombreUser", nombre));
                sqlcmd.Parameters.Add(new SqlParameter("@pwUser", pw));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        userLogin = new Usuario();
                        userLogin.Contraseña = dr["contraseña"].ToString();
                        userLogin.Nombre = dr["nombre"].ToString();
                        userLogin.CodUsuario = int.Parse(dr["codUsuario"].ToString());
                        userLogin.IsActivo = bool.Parse(dr["activo"].ToString());
                        userLogin.IdRol = int.Parse(dr["idRol"].ToString());
                        userLogin.NombreRol = dr["nombreRol"].ToString();
                        if (dr["inicioPrimeraVez"] == DBNull.Value)
                        {
                            userLogin.inicioPrimeraVez = false;
                        }
                        else
                        {
                            userLogin.inicioPrimeraVez = (bool)dr["inicioPrimeraVez"];
                        }
                        if (dr["estaLogueado"] == DBNull.Value)
                            userLogin.IsLogueado = false;
                        else
                            userLogin.IsLogueado = bool.Parse(dr["estaLogueado"].ToString());
                        if (dr["quiereMensajeBienvenida"] == DBNull.Value)
                            userLogin.QuiereMsjBienvenida = false;
                        else
                            userLogin.QuiereMsjBienvenida = bool.Parse(dr["quiereMensajeBienvenida"].ToString());
                        if (dr["legajoMedico"] != DBNull.Value)
                        {
                            userLogin.legajoMedico = (long)dr["legajoMedico"];
                        }
                        if (dr["legajoEmpleado"] != DBNull.Value)
                        {
                            userLogin.legajoEmpleado = (long)dr["legajoEmpleado"];
                        }
                    }
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return userLogin;
        }
        public static bool actualizarContraseña(Usuario us)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "update Usuario set  inicioPrimeraVez=@ipv, contraseña=@contraseña "
                                + "where codUsuario=@codUsuario";
                List<SqlParameter> lsp = new List<SqlParameter>();
                lsp.Add(new SqlParameter("@ipv", true));
                lsp.Add(new SqlParameter("@contraseña", us.Contraseña));
                lsp.Add(new SqlParameter("@codUsuario", us.CodUsuario));
                int res = DB.EjecutarCommand(comando, lsp, con, tran);
                if (res > 0)
                {
                    tran.Commit();
                    resultado = true;
                }

            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                    resultado = false;
                }
                throw;
            }
            finally { con.Close(); }
            return resultado;
        }
        public static void actualizarPrefMensajeBienvenida(int idUser, bool op)
        {
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE Usuario SET quiereMensajeBienvenida = @op WHERE (codUsuario = @idUser)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@op", op));
                sqlcmd.Parameters.Add(new SqlParameter("@idUser", idUser));
                sqlcmd.ExecuteNonQuery();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
        }

        public static void iniciarSesion(int idUser)
        {
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE Usuario SET estaLogueado = @op WHERE (codUsuario = @idUser)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@op", true));
                sqlcmd.Parameters.Add(new SqlParameter("@idUser", idUser));
                int filas = sqlcmd.ExecuteNonQuery();

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
        }


        public static bool cerrarSesion(int idUser)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE Usuario SET estaLogueado = @op WHERE (codUsuario = @idUser)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@op", false));
                sqlcmd.Parameters.Add(new SqlParameter("@idUser", idUser));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                {
                    res = true;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
        public static bool cerrarSesion(string nombre)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "UPDATE Usuario SET estaLogueado = @op WHERE (nombre = @nombre)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@op", false));
                sqlcmd.Parameters.Add(new SqlParameter("@nombre", nombre));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                {
                    res = true;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
    }
    


}
